package com.it.common.utils

import android.content.Context
import android.os.Environment
import android.util.Log
import com.elvishew.xlog.LogConfiguration
import com.elvishew.xlog.LogLevel
import com.elvishew.xlog.XLog
import com.elvishew.xlog.flattener.ClassicFlattener
import com.elvishew.xlog.printer.file.backup.FileSizeBackupStrategy2
import com.elvishew.xlog.printer.file.clean.FileLastModifiedCleanStrategy
import com.elvishew.xlog.printer.file.naming.ChangelessFileNameGenerator
import com.it.common.utils.LogUtil.APP_LOG_FILE_NAME
import java.io.File


object XLogUtils {

    private const val LOG_MAX_TIME = 1000 * 60 * 60 * 24 * 5L    // 日志文件最长保留时间5天
    private const val LOG_MAX_SIZE = 1024 * 1024 * 30L    // 日志文件最大40MB
    private const val LOG_MAX_BACKUP = 10    // 最大日志备份文件10个
    var LOG_FILE_DIR: String =
        Environment.getExternalStorageDirectory().toString() + "/hm/logs" //日志根路径
    fun xLogInit(context: Context) {
        var dir = File(LOG_FILE_DIR)
        if(dir!=null&&!dir.exists()){
            Log.d("XLogUtils", "xLogInit: ${dir.exists()}")
            val a = dir.mkdir()
            Log.d("XLogUtils", "xLogInit:== ${a}")
        }
        // ====xlog 日志功能初始化
        val config: LogConfiguration = LogConfiguration.Builder()
            .logLevel(
                LogLevel.ALL        // 开发测试期间，打印全部日志
//                if (BuildConfig.DEBUG) LogLevel.ALL // 指定日志级别，低于该级别的日志将不会被打印，默认为 LogLevel.ALL
//                else LogLevel.INFO
            )
            //.enableThreadInfo() // 允许打印线程信息，默认禁止
            //.enableStackTrace(2) // 允许打印深度为 2 的调用栈信息，默认禁止
            //.enableBorder() // 允许打印日志边框，默认禁止
            //.jsonFormatter(MyJsonFormatter()) // 指定 JSON 格式化器，默认为 DefaultJsonFormatter
            //.xmlFormatter(MyXmlFormatter()) // 指定 XML 格式化器，默认为 DefaultXmlFormatter
            //.throwableFormatter(MyThrowableFormatter()) // 指定可抛出异常格式化器，默认为 DefaultThrowableFormatter
            //.threadFormatter(MyThreadFormatter()) // 指定线程信息格式化器，默认为 DefaultThreadFormatter
            //.stackTraceFormatter(MyStackTraceFormatter()) // 指定调用栈信息格式化器，默认为 DefaultStackTraceFormatter
            //.borderFormatter(MyBoardFormatter()) // 指定边框格式化器，默认为 DefaultBorderFormatter
//            .addObjectFormatter(
//                AnyClass::class.java,  // 为指定类型添加对象格式化器
//                AnyClassObjectFormatter()
//            ) // 默认使用 Object.toString()
//            .addInterceptor(
//                BlacklistTagsFilterInterceptor( // 添加黑名单 TAG 过滤器
//                    "blacklist1", "blacklist2", "blacklist3"
//                )
//            )
//            .addInterceptor(MyInterceptor()) // 添加一个日志拦截器
            .build()

        val androidPrinter: com.elvishew.xlog.printer.Printer = com.elvishew.xlog.printer.AndroidPrinter(true) // 通过 android.util.Log 打印日志的打印器

        // val consolePrinter: com.elvishew.xlog.printer.Printer = com.elvishew.xlog.printer.ConsolePrinter() // 通过 System.out 打印日志到控制台的打印器

        val myLogDir = LOG_FILE_DIR

        val filePrinter: com.elvishew.xlog.printer.Printer = com.elvishew.xlog.printer.file.FilePrinter.Builder(
            myLogDir) // 指定保存日志文件的路径
            .fileNameGenerator(ChangelessFileNameGenerator(APP_LOG_FILE_NAME)) // 指定日志文件名生成器，每天生成一个日志文件
            .backupStrategy(FileSizeBackupStrategy2(LOG_MAX_SIZE, LOG_MAX_BACKUP)) // 指定日志文件备份策略，默认为 FileSizeBackupStrategy(1024 * 1024)
            .cleanStrategy(FileLastModifiedCleanStrategy(LOG_MAX_TIME)) // 指定日志文件清除策略，默认为 NeverCleanStrategy()，最多保存7天
            .flattener(ClassicFlattener()) // 指定日志平铺器，默认为 DefaultFlattener
            // .writer(MyWriter()) // 指定日志写入器，默认为 SimpleWriter
            .build()

        XLog.init( // 初始化 XLog
            config,  // 指定日志配置，如果不指定，会默认使用 new LogConfiguration.Builder().build()
            androidPrinter,  // 添加任意多的打印器。如果没有添加任何打印器，会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)
            // consolePrinter,
            filePrinter
        )

        XLog.d("XLog will save log in dir: %s", myLogDir)
        XLog.d("日志文件保存于目录: %s", myLogDir)
    }

}